//package com.cyzy.ws;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.cyzy.config.GetHttpSessionConfig;
//import com.cyzy.domain.dto.CustomerServiceDto;
//import com.cyzy.domain.dto.MessageDto;
//import com.cyzy.service.TAgentService;
//import com.cyzy.service.TUserAgentMessageService;
//import com.cyzy.utils.MessageUtil;
//import io.swagger.models.auth.In;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpSession;
//import javax.websocket.*;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * 客服聊天
// *
// * @author Honarly
// * @date 2024.11.11
// */
//@ServerEndpoint(value = "/chat", configurator = GetHttpSessionConfig.class)
//@Component
//public class ChatEndPoint {
//
//    @Autowired
//    private TUserAgentMessageService tUserAgentMessageService;
//
//    @Autowired
//    private TAgentService tAgentService;
//
//    // 点击客服选项存储CustomerServiceDto
//    // 客服，该客服服务的用户
//    private static final Map<Integer, Set<Integer>> serverUsers = new ConcurrentHashMap<>();
//    // 用户，对应的客服
//    private static final Map<Integer, Integer> users = new ConcurrentHashMap<>();
//    // 存储session，便于找到对应用户发送消息
//    private static final Map<Integer, Session> onlineUsers = new ConcurrentHashMap<>();
//
//    private RedisTemplate<String, String> redis;
//
//    private final String currUser = "currUser";
//
//    private HttpSession httpSession;
//    @OnOpen
//    public void onOpen(Session session, EndpointConfig config) {
//        System.out.println("WebSocket 连接成功");
//        // 从session中取出当前登录的用户/客服信息
//        this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
//        if (this.httpSession == null) {
//            return;
//        }
//        System.out.println("HttpSession" + this.httpSession.getAttribute(this.currUser));
//        String currUser = (String) this.httpSession.getAttribute(this.currUser);
//        CustomerServiceDto curr = JSONObject.parseObject(currUser, CustomerServiceDto.class);
//        onlineUsers.put(curr.getUserId(), session);
//        // 判断是客服登录还是用户登录
//        if (curr.getType() == 1) {
//            // 用户
//            // 判断是智能客服还是人工客服
//            if (curr.getSelected() == 1) {
//                // 智能客服
//                handleAutoAgent(session, curr.getUserId());
//            }else if (curr.getSelected() == 2) {
//                // 人工客服
//                handleManualAgent(session, curr.getUserId());
//            }
//        }else if (curr.getType() == 2) {
//            // 客服
//            handleAgent(session, curr.getUserId());
//        }
//    }
//
//    /**
//     * 处理智能客服逻辑
//     * @param session
//     * @param userId
//     */
//    private void handleAutoAgent(Session session, Integer userId) {
//        try {
//            // 处理智能客服逻辑
//            // 例如，从Redis中获取关键词匹配的语句
//            String response = redis.opsForValue().get("auto_response_" + userId);
//            session.getBasicRemote().sendText(response);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 随机分配客服
//     * @param session
//     * @param userId
//     */
//    private void handleManualAgent(Session session, Integer userId) {
//        try {
//            // 随机分配客服
//            Integer assignedAgent = assignAgent();
//            if (assignedAgent != null) {
//                // 分配成功，更新用户和客服的映射
//                users.put(userId, assignedAgent);
//                serverUsers.get(assignedAgent).add(userId);
//                // 通知用户已分配客服
//                session.getBasicRemote().sendText(MessageUtil.setMessage(true, 1, "您已成功分配到客服：" + assignedAgent, assignedAgent));
//                // 通知客服已经被分配到用户
//                onlineUsers.get(assignedAgent).getBasicRemote().sendText(MessageUtil.setMessage(true, 14, "已分配用户" + userId, serverUsers.get(assignedAgent)));
//            } else {
//                // 客服繁忙
//                users.put(userId, null);
//                session.getBasicRemote().sendText(MessageUtil.setMessage(true, 2, "当前所有客服都忙碌，请稍后再试", null));
//            }
//        } catch (Exception e) {
//
//        }
//    }
//
//    /**
//     * 随机分配客服2
//     * @return
//     */
//    private Integer assignAgent() {
//        Integer selectedAgent = null;
//        int minUsers = Integer.MAX_VALUE;
//        for (Map.Entry<Integer, Set<Integer>> entry : serverUsers.entrySet()) {
//            if (entry.getValue().size() < minUsers) {
//                minUsers = entry.getValue().size();
//                selectedAgent = entry.getKey();
//            }
//        }
//        if (minUsers == Integer.MAX_VALUE) {
//            return null; // 没有可用的客服
//        }
//        return selectedAgent;
//    }
//
//    /**
//     * 客服登录
//     * @param session
//     * @param userId
//     */
//    private void handleAgent(Session session, Integer userId) {
//        try {
//            if (serverUsers.get(userId) != null && serverUsers.get(userId).size() > 0) {
//                session.getBasicRemote().sendText(MessageUtil.setMessage(true, 14, "已分配历史用户", serverUsers.get(userId)));
//                return;
//            }
//            serverUsers.put(userId, new HashSet<Integer>());
//            for (Integer key : users.keySet()) {
//                if (users.get(key) == null) {
//                    // 用户绑定客服
//                    users.replace(key, userId);
//                    // 客服绑定用户
//                    serverUsers.get(userId).add(key);
//                    session.getBasicRemote().sendText(MessageUtil.setMessage(true, 14, "已分配用户" + key, serverUsers.get(userId)));
//
//                    onlineUsers.get(key).getBasicRemote().sendText(MessageUtil.setMessage(true, 1, "您已成功分配到客服：" + userId, userId));
//                    return;
//                }
//            }
//            session.getBasicRemote().sendText(MessageUtil.setMessage(true, 12, "正在分配用户，请耐心等待~", null));
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        System.out.println("接收到来自客户端的消息： " + message);
//        // 解析消息数据
//        MessageDto msg = JSON.parseObject(message, MessageDto.class);
//        Integer toUserId = msg.getToUserId();
//        String content = msg.getMessage();
//
//        // 当前用户
//        String currUser = (String) this.httpSession.getAttribute(this.currUser);
//        CustomerServiceDto curr = JSONObject.parseObject(currUser, CustomerServiceDto.class);
//        if (curr.getType() == 1) {
//            // 如果是用户
//            // 结束服务传递消息：direction=3,content=评级
//            if (msg.getDirection() == 3) {
//                // 如果选择结束服务
//                handleUserEndMessage(session, curr.getUserId(), content);
//            }else {
//                handleUserMessage(session, toUserId, content);
//            }
//        }else if (curr.getType() == 2) {
//            // 如果是客服
//            // 结束服务传递消息：direction=3
//            if (msg.getDirection() == 3) {
//                // 如果选择下班
//                handleAgentEndMessage(session, curr.getUserId(), content);
//            }else {
//                handleAgentMessage(session, toUserId, content);
//            }
//        }
//    }
//
//    private void handleUserEndMessage(Session session, Integer userId, String content) {
//        try {
//            Session agentSession = onlineUsers.get(users.get(userId));
//            if (content == null) {
//                agentSession.getBasicRemote().sendText(MessageUtil.setMessage(true, 13, "用户已结束服务。给您默认好评", null));
//            }else {
//                agentSession.getBasicRemote().sendText(MessageUtil.setMessage(true, 13, "用户已结束服务。为您评星级" + content + "星", content));
//            }
//            // 回复用户您已结束服务
//            onlineUsers.get(userId).getBasicRemote().sendText(MessageUtil.setMessage(true, 5, "结束服务成功", null));
//            // 结束用户session
//            serverUsers.get(users.get(userId)).remove(userId);
//            users.remove(userId);
//            onlineUsers.remove(userId);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    private void handleAgentEndMessage(Session session, Integer userId, String content) {
//        try {
//            // 广播所有用户
//            for (Integer i : serverUsers.get(userId)) {
//                onlineUsers.get(i).getBasicRemote().sendText(MessageUtil.setMessage(true, 4, "客服已下班，请刷新页面，重新为您分配客服。", null));
//                System.out.println(users.get(i));
//                if (users.get(i) != null) {
//                    users.put(i, null);
//                }
//            }
//            serverUsers.remove(userId);
//            onlineUsers.remove(userId);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    private void handleUserMessage(Session session, Integer toUserId, String content) {
//        // 处理用户消息
//        // TODO:存储到Redis和MQ
//        // 发送消息到对应的客服
//        Session agentSession = onlineUsers.get(toUserId);
//        System.out.println("客服session" + agentSession);
//        if (agentSession != null) {
//            try {
//                agentSession.getBasicRemote().sendText(MessageUtil.setMessage(false, 0, content, null));
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    private void handleAgentMessage(Session session, Integer toUserId, String content) {
//        // 处理客服消息
//        // TODO:存储到Redis和MQ
//        // 发送消息到用户
//        Session userSession = onlineUsers.get(toUserId);
//        if (userSession != null) {
//            try {
//                userSession.getBasicRemote().sendText(MessageUtil.setMessage(false, 0, content, null));
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    @OnClose
//    public void onClose(Session session) {
//        try {
//            if (this.httpSession == null || this.httpSession.getAttribute(this.currUser) == null) {
//                return;
//            }
//            String currUser = (String) this.httpSession.getAttribute(this.currUser);
//            CustomerServiceDto curr = JSONObject.parseObject(currUser, CustomerServiceDto.class);
//            Integer type = curr.getType();
//            // 判断是客服下班还是用户退出
//            // 只能由他们选择下班、换客服才能解除关系，而不是中断联系
//            if (type == 1) {
//                // 告诉客服用户已离线
//                Integer i = users.get(curr.getUserId());
//                Session agentSession = onlineUsers.get(i);
//                agentSession.getBasicRemote().sendText(MessageUtil.setMessage(true, 13, "用户已断开连接。", null));
//            }else if (type == 2) {
//                // 告诉用户客服已离线
//                Set<Integer> usersId = serverUsers.get(curr.getUserId());
//                for (Integer i : usersId) {
//                    onlineUsers.get(i).getBasicRemote().sendText(MessageUtil.setMessage(true, 4, "客服已离线，请发送离线消息或切换客服。", null));
//                }
//            }
//        }catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//}